/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

import java.io.Serializable;

/**
 *
 * @author Usuario
 */
public class TablaPosiciones implements Serializable{
    /**
     * Arreglo de los nombres de los equipos de la liga
     */    
    private String equipos[];
    /**
     * Matriz de las Calificaciones de los equipos
     * En i = 0, Juegos Jugados JJ 
     * En i = 1, Juegos Ganados JG
     * En i = 2, Juegos Empatados JE
     * En i = 3, Juegos Perdidos JP
     * En i = 4, Goles a Favor GF
     * En i = 5, Goles en Contra GC
     * En i = 6, Puntos del equipo Pts
     */
    private int MatrizPosiciones[][];
    private int POS = 0, JJ = 1, JG = 2, JE = 3, JP = 4, GF = 5, GC = 6, Pts = 7;

    public TablaPosiciones(String Liga) {
        LectorArchivo l = new LectorArchivo();
        equipos = l.leerEquipos(Liga);
        MatrizPosiciones = new int[8][equipos.length];
        for (int i = 0; i<equipos.length; i++){
            MatrizPosiciones[POS][i] = i+1;
            MatrizPosiciones[JJ][i] = 0;
            MatrizPosiciones[JG][i] = 0;
            MatrizPosiciones[JE][i] = 0;  
            MatrizPosiciones[JP][i] = 0;
            MatrizPosiciones[GF][i] = 0;
            MatrizPosiciones[GC][i] = 0;
            MatrizPosiciones[Pts][i] = 0;
        }
        ordenarEquipos();
    }
    
    public String[] getEquipos(){
        return equipos;
    }
    
    public int[][] getTablaPosiciones(){      
        return MatrizPosiciones;
    }
    
    /**
     * Busca el nombre del equipo Local
     * @param Enc 
     */
    public int BuscarEquipoLocal(Encuentro Enc){
      int i;  
 
        for(i=0; i<equipos.length; i++){
            if (equipos[i].equals(Enc.getEquipo(0).getNombre())){
                return i;   
            }    
        }
        return -1;
    }
    
    /**
     * Busca el nombre del equipo Visitante
     * @param Enc 
     */
    public int BuscarEquipoVisitante(Encuentro Enc){
      int j;  
       
        for(j=0; j<equipos.length; j++){
            if (equipos[j].equals(Enc.getEquipo(1).getNombre())){
                return j;   
            }    
        } 
        return -1;
    }        
    
    /**
     * Modifica la informacion de la tabla segun el Resultado del partido
     * @param Enc 
     */
    public void AnadirEncuentro(Encuentro Enc){
        int local,visitante;
        
        local=BuscarEquipoLocal(Enc);   
        visitante=BuscarEquipoVisitante(Enc);
        
        if (Enc.getResultado()[0]>Enc.getResultado()[1]){
            MatrizPosiciones[JJ][local]++;
            MatrizPosiciones[JG][local]++;
            MatrizPosiciones[GF][local]+= Enc.getResultado()[0];
            MatrizPosiciones[GC][local]+= Enc.getResultado()[1];
            MatrizPosiciones[Pts][local]+= 3;
            MatrizPosiciones[JJ][visitante]++;
            MatrizPosiciones[JP][visitante]++;
            MatrizPosiciones[GF][visitante]+=Enc.getResultado()[1];
            MatrizPosiciones[GC][visitante]+=Enc.getResultado()[0];           
        }
        if (Enc.getResultado()[0]<Enc.getResultado()[1]){
            MatrizPosiciones[JJ][visitante]++;
            MatrizPosiciones[JG][visitante]++;
            MatrizPosiciones[GF][visitante]+= Enc.getResultado()[1];
            MatrizPosiciones[GC][visitante]+= Enc.getResultado()[0];
            MatrizPosiciones[Pts][visitante]+= 3;
            MatrizPosiciones[JJ][local]++;
            MatrizPosiciones[JP][local]++;
            MatrizPosiciones[GF][local]+=Enc.getResultado()[0];
            MatrizPosiciones[GC][local]+=Enc.getResultado()[1];           
        }
        if (Enc.getResultado()[0]==Enc.getResultado()[1]){
            MatrizPosiciones[JJ][visitante]++;
            MatrizPosiciones[JE][visitante]++;
            MatrizPosiciones[GF][visitante]+= Enc.getResultado()[1];
            MatrizPosiciones[GC][visitante]+= Enc.getResultado()[0];
            MatrizPosiciones[Pts][visitante]++;
            MatrizPosiciones[JJ][local]++;
            MatrizPosiciones[JE][local]++;
            MatrizPosiciones[GF][local]+=Enc.getResultado()[0];
            MatrizPosiciones[GC][local]+=Enc.getResultado()[1];  
            MatrizPosiciones[Pts][local]++;
        }
        
        ordenarEquipos();
        
    }
    
    /**
     * Método que ordena la matriz de posiciones, de forma decreciente evaluando los puntos de los equipos.
     * Si tienen la misma cantidad de puntos, entonces se dispone a evaluar la posicion por diferencia de goles.
     */
    public void ordenarEquipos(){
        int[] arrayPts = new int[equipos.length];
        int[] arrayGoles = new int[equipos.length];
        int contador = 0;
        
        for (int i = 0; i<equipos.length; i++){
            arrayPts[i] = MatrizPosiciones[Pts][i];
            arrayGoles[i] = MatrizPosiciones[GF][i] - MatrizPosiciones[GC][i];
            if (arrayPts[i] == 0 && arrayGoles[i] == 0){
                contador++;
            }
        }
        
        for (int i = 0,mayorPosiciones = 0; i<equipos.length && contador != equipos.length; i++){
            for (int j = 0, mayor = -1,mayorPosicion = 0; j<equipos.length; j++){
                if (mayor < arrayPts[j]){
                    mayor = arrayPts[j];
                    mayorPosicion = j;
                }else if(mayor == arrayPts[j]){
                    if (arrayGoles[mayorPosicion]<arrayGoles[j]) {
                        mayor = arrayPts[j];
                        mayorPosicion = j;
                    }
                }
                mayorPosiciones = mayorPosicion;
            }
            MatrizPosiciones[POS][mayorPosiciones] = i+1;
            arrayPts[mayorPosiciones] = -i;
            arrayGoles[mayorPosiciones] = -20;

        }
    }
    
    
}
